<?php
//创建Model类,因该类为抽象类,必须定义子类才可以使用
abstract class Model{

	//如果调用的静态方法不存在，则自动触发:__callStatic
	public static function __callStatic($method,$param_arr){

		//这里我们直接设置了$class类名,实际工作中应该用内部方法来实现
		$class = 'Query';

		//动态调用指定类$class中的指定方法$mothod,参数以数组方式$param_arr传入
		return call_user_func_array([$class,$method], $param_arr);
	}	
}

//创建数据库查询类:Query
class Query{

	//因为我们模拟的是静态调用,这里select()必须设置与静态方法
	public static function select($param_arr){

		//直接返回调用数据:
		return $param_arr;
	}	
}

//创建自定义模型类:User,假定与数据表User绑定
class User extends Model{
	//这里是自定义模型类的代码
}

//1. 创建一个自定义结果集,以二维数组呈现,来模拟数据库查询结果
$data = [
		 ['id' => 1,'name' => 'Peter','age' => 20,'salary' => 4000],
		 ['id' => 2,'name' => 'Jack','age' => 26,'salary' => 5000],
		 ['id' => 3,'name' => 'Tom','age' => 30,'salary' => 6800],
		];

//2. 模型类User静态调用select()方法,参数是数据库查询结果集(以二维数据模拟)
//注意:User类中并没有定义:静态方法 select(),此时会自动调用父类Model中的__callStatic()方法
//该静态魔术方法会自动将当前调用的select($data)的方法名和参数传给:
//call_user_func_array(['Query','select'], $data);
$result=User::select($data); 

//3. 格式化输出查询结果
//设置表头信息
$caption = '<h3 align="center">学生信息表</h3>';

//将传入的表中记录集,以表格方式格式化输出
//设置表头信息
$table = $caption.'<table border="1" cellspacing="0" cellpadding="0" width="300" align="center"><th>id</th><th>姓名</th><th>年龄</th><th>工资</th>';

//根据表中记录数量,循环输出
foreach ($result as $value) {
	$table = $table. '<tr>';
	$table = $table. '<td>'.$value['id'].'</td>';
	$table = $table. '<td>'.$value['name'].'</td>';
	$table = $table. '<td>'.$value['age'].'</td>';
	$table = $table. '<td>'.$value['salary'].'</td>';
	$table = $table. '</tr>';
}

echo $table;